package com.regent.central.bill.repository;

import com.regent.central.bill.common.ActionType;
import com.regent.central.bill.core.SaleOrderAction;
import com.regent.central.bill.dto.sale_order.*;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;

import java.util.Date;
import java.util.List;

public interface SaleOrderActionMapper extends Mapper<SaleOrderAction> {

    /**
     * 获取销售单的操作记录列表
     *
     * @param saleOrderId     销售单ID
     * @param startSearchTime 开始搜索时间
     * @param orderBy         排序字段
     * @param orderAs         排序方式
     * @return 销售单的操作记录列表
     */
    List<SaleOrderActionDTO> getSaleOrderActions(
            @Param("saleOrderId") String saleOrderId,
            @Param("startSearchTime") String startSearchTime,
            @Param("orderBy") String orderBy,
            @Param("orderAs") String orderAs
    );

    /**
     * 获取销售单操作记录的开单要货记录列表
     *
     * @param parentActionIds 操作记录ID
     * @return 操作记录的开单要货记录列表
     */
    List<SaleOrderActionGoodsDTO> getSaleOrderActionCreateGoodsParentIn(
            @Param("parentActionIds") String... parentActionIds
    );

    /**
     * 获取销售单操作记录的改他单/改本单货品记录列表
     *
     * @param parentActionIds 操作记录ID
     * @return 操作记录的改他单/改本单货品记录列表
     */
    List<SaleOrderActionGoodsDTO> getSaleOrderActionModifyGoodsParentIn(
            @Param("parentActionIds") String... parentActionIds
    );

    /**
     * 获取销售单操作记录的退货记录列表
     *
     * @param parentActionIds 操作记录ID
     * @return 操作记录的退货记录列表
     */
    List<SaleOrderActionGoodsDTO> getSaleOrderActionReturnGoodsParentIn(
            @Param("parentActionIds") String... parentActionIds
    );

    /**
     * 获取销售单操作记录的发货记录列表
     *
     * @param parentActionIds 操作记录ID
     * @return 操作记录的发货记录列表
     */
    List<SaleOrderActionGoodsDTO> getSaleOrderActionDeliveryGoodsParentIn(
            @Param("parentActionIds") String... parentActionIds
    );

    /**
     * 获取销售单操作记录的汇款记录列表
     *
     * @param actionIds 操作记录ID
     * @return 操作记录的汇款记录列表
     */
    List<SaleOrderActionRemittanceDTO> getSaleOrderActionRemittancesIn(
            @Param("actionIds") String... actionIds
    );

    /**
     * 获取销售单操作记录的核进记录列表
     *
     * @param actionIds 操作记录ID
     * @return 操作记录的核进记录列表
     */
    List<SaleOrderActionClearanceDTO> getSaleOrderActionInClearancesIn(
            @Param("actionIds") String... actionIds
    );

    /**
     * 获取销售单操作记录的核出记录列表
     *
     * @param actionIds 操作记录ID
     * @return 操作记录的核出记录列表
     */
    List<SaleOrderActionClearanceDTO> getSaleOrderActionOutClearancesIn(
            @Param("actionIds") String... actionIds
    );

    /**
     * 获取销售单操作记录的发货单记录及其发货货品列表
     *
     * @param parentActionIds 操作记录ID
     * @return 销售单操作记录的发货单记录及其发货货品列表
     */
    List<SaleOrderActionDeliveryDTO> getSaleOrderActionDeliveriesParentIn(
            @Param("parentActionIds") String... parentActionIds
    );

    /**
     * 撤销销售单动作
     *
     * @param saleOrderActionId 销售单动作ID
     * @param userCanceled      撤销人
     * @param dateCanceled      撤销时间
     */
    void cancel(
            @Param("saleOrderActionId") String saleOrderActionId,
            @Param("userCanceled") String userCanceled,
            @Param("dateCanceled") Date dateCanceled
    );

    /**
     * 撤销销售单动作子记录
     *
     * @param saleOrderActionId 销售单父动作ID
     * @param userCanceled      撤销人
     * @param dateCanceled      撤销时间
     */
    void cancelChildren(
            @Param("saleOrderActionId") String saleOrderActionId,
            @Param("userCanceled") String userCanceled,
            @Param("dateCanceled") Date dateCanceled
    );

    /**
     * 根据动作的数据ID和动作类型查询销售单动作记录
     *
     * @param actionType 动作类型
     * @param actionId   动作数据ID
     * @return 销售单动作记录
     */
    SaleOrderAction selectBy(
            @Param("actionType") ActionType actionType,
            @Param("actionId") String actionId
    );

    /**
     * 获取销售单的某个发货单的发货货品动作记录
     *
     * @param saleOrderId 销售单ID
     * @param deliveryId  发货单ID
     * @return 该销售单的某个发货单的发货货品动作记录
     */
    List<SaleOrderAction> getSaleOrderDeliveryGoodsActions(
            @Param("saleOrderId") String saleOrderId,
            @Param("deliveryId") String deliveryId
    );

    /**
     * 根据销售单ID和动作类型查询销售单动作
     *
     * @param saleOrderId 销售单ID
     * @param actionType  动作类型
     * @return 销售单动作
     */
    SaleOrderAction selectByOrderIdAndActionType(
            @Param("saleOrderId") String saleOrderId,
            @Param("actionType") ActionType actionType
    );

    /**
     * 根据销售单ID和动作类型查询销售单动作
     *
     * @param saleOrderId 销售单ID
     * @param actionType  动作类型
     * @return 销售单动作
     */
    List<SaleOrderAction> listByOrderIdAndActionType(
            @Param("saleOrderId") String saleOrderId,
            @Param("actionType") ActionType actionType
    );

    /**
     * 根据销售单ID和actionId进行撤销操作
     *
     * @param actionType   动作类型
     * @param userCanceled 撤销人
     * @param actionIds    动作ID
     */
    void cancelActions(
            @Param("actionType") ActionType actionType,
            @Param("userCanceled") String userCanceled,
            @Param("actionIds") String... actionIds
    );

    /**
     * 获取 actiontype为 Delivery 的 actionId
     * @param deliveryOrderId
     * @return
     */
    List<SaleOrderAction> getSaleOrderDeliveryActions(
            @Param("deliveryOrderId") String deliveryOrderId
    );

    /**
     * 获取销售单动作列表
     *
     * @param saleOrderId 销售单ID
     * @param parent      是否是父动作
     * @param canceled    已撤销
     * @param deleted     已删除
     * @return 销售单动作列表
     */
    List<SaleOrderAction> getSaleOrderAllActions(
            @Param("saleOrderId") String saleOrderId,
            @Param("parent") Boolean parent,
            @Param("canceled") Boolean canceled,
            @Param("deleted") Boolean deleted
    );

}